.TITLE UTSUB .IDENT /02/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 02 ; ; T. J. MILLER 23-OCT-77 ; ; THIS MODULE CONTAINS ROUTINES WHICH MAY BE CALLED AT TASK STATE. ; ; MODIFIED BY: ; ; J. E. PROVINO 22-JUN-79 ; ; JP130 -- FIX CONDITIONALS. ; ; J. E. PROVINO 16-JUL-79 ; ; JP135 -- USE EIS INSTRUCTIONS IN $MUL AND $DIV. ; ;+ ; **-$MUL-INTEGER MULTIPLY MAGNITUDE NUMBERS ; ; INPUTS: ; ; R0=MULTIPLIER. ; R1=MULTIPLICAND. ; ; OUTPUTS: ; ; DOUBLE WORD RESULT IS RETURNED WITH THE ; HIGH PART IN R0 AND THE LOW PART IN R1. ; ; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL. ;- $MUL:: TST R0 ;NEGATIVE MULTIPLIER? BMI 5$ ;IF MI YES TST R1 ;NEGATIVE MULTIPLICAND? BMI 5$ ;IF MI YES MUL R1,R0 ;MULTIPLY R1 BY R0 RETURN ; 5$: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PART 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ; 20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GO CMP (SP)+,(SP)+ ;CLEAN STACK RETURN ; ;+ ; **-$DIV-INTEGER DIVIDE MAGNITUDE NUMBERS ; ; INPUTS: ; ; R0=DIVIDEND. ; R1=POSITIVE DIVISOR. ; ; OUTPUTS: ; ; QUOTIENT IS RETURNED IN R0 AND REMAINDER IN R1. ; ; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL. ;- $DIV:: MOV R2,-(SP) ;SAVE R2 FOR INTERFACE TO DOUBLE DIVIDE MOV R1,R2 ;COPY DIVISOR FOR $DBDIV BMI 20$ ;IF MI DIVISOR IS NEGATIVE BEQ 30$ ;IF EQ DIVISOR IS ZERO MOV R0,R1 ;SET UP DIVIDEND IN R0 AND R1 CLR R0 ; DIV R2,R0 ;DIVIDE R0,R1 BY R2 10$: MOV (SP)+,R2 ;RESTORE R2 RETURN ; 20$: CLR R1 ;ZERO HIGH-ORDER WORD FOR $DBDIV CALL $DBDIV ;PERFORM THE DIVIDE OPERATION BR 10$ ; 30$: MOV R0,R1 ;MOVE DIVIDEND TO R1 MOV #177777,R0 ;QUOTIENT BR 10$ ; ;+ ; **-$DBDIV-DOUBLE-PRECISION DIVIDE MAGNITITUDE NUMBERS ; ; INPUTS: ; ; R0=LOW-ORDER PART OF DIVIDEND. ; R1=HIGH-ORDER PART OF DIVIDEND. ; R2=POSITIVE DIVISOR. ; ; OUTPUTS: ; ; R0=LOW-ORDER PART OF QUOTIENT. ; R1=REMAINDER. ; R2=UNDEFINED FOR POSSIBLE FUTURE USE. ; R3-R5 ARE PRESERVED. ; ; NOTE: IT IS THE CALLER'S RESPONSIBILITY TO INSURE THAT THE ; DIVISION OF THE INPUT OPERANDS YIELDS NO MORE THAN ; 16 BITS IN THE QUOTIENT. ;- $DBDIV::MOV #16.,-(SP) ;SET LOOP COUNT 30$: ASL R0 ;DOUBLE LEFT SHIFT ROL R1 ; CMP R1,R2 ;SUBTRACT OUT DIVISOR? BLO 40$ ;IF LO NO SUB R2,R1 ;SUBTRACT OUT DIVISOR INC R0 ;ADD IN LOW BIT 40$: DEC (SP) ;DECREMENT LOOP COUNT BGT 30$ ;IF GT MORE TO GO TST (SP)+ ;CLEAN STACK RETURN ; ;+ ; **-$CAT5-CONVERT ASCII TO RAD50 ; ; INPUTS: ; ; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER. ; R1=PERIOD DISPOSITION FLAG. ; IF R1 EQ 0, THEN PERIOD IS A TERMINATOR. ; IF R1 NE 0, THEN PERIOD IS A RAD50 CHARACTER. ; ; OUTPUTS: ; ; C=1 IF SCAN WAS TERMINATED BY A NON-RAD50 CHARACTER. ; C=0 IF THREE RAD50 CHARACTERS WERE CONVERTED. ; NOTE: IF EITHER CASE THE FOLLOWING VALUES ARE RETURNED. ; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER. ; R1=PACKED RAD50 CHARACTERS. ; R2=TERMINAL CHARACTER. ; R3 IS PRESERVED. ;- .IF DF R$$DSP $CAT5:: SAVNR ;SAVE NONVOLITILE REGISTERS MOV R3,-(SP) ;SAVE R3 AS WELL MOV R1,-(SP) ;SAVE PERIOD DISPOSITION FLAG CLR R1 ;CLEAR ACCUMULATION MOV #CVTBL,R3 ;GET ADDRESS OF CONVERSION TABLE 10$: MOVB (R0)+,R5 ;GET NEXT CHARACTER MOV #CNTRL,R4 ;GET ADDRESS OF CONTROL STRING CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NO CMPB (R4)+,R5 ;ALPHABETIC? BLOS 50$ ;IF LOS YES CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NO CMPB (R4)+,R5 ;NUMERIC? BLOS 40$ ;IF LOS YES CMPB (R4)+,R5 ;"$"? BEQ 30$ ;IF EQ YES CMPB (R4)+,R5 ;"SPACE"? BEQ 60$ ;IF EQ YES TST (SP) ;PERIOD RAD50 CHARACTER? BEQ 60$ ;IF EQ NO CMPB (R4)+,R5 ;"."? BEQ 40$ ;IF EQ YES BR 60$ ; 20$: SUB #' -11,R5 ;SPACE 30$: SUB #11-22,R5 ;"$" 40$: SUB #22-100,R5 ;PERIOD/DIGIT 50$: SUB #100,R5 ;ALPHABETIC MOV R0,-(SP) ;SAVE NEXT BYTE ADDRESS MOV (R3)+,R0 ;GET CONVERSION CONSTANT MOV R1,-(SP) ;SAVE ACCUMULATION MOV R5,R1 ;SET MULTIPLIER CALL $MUL ;SCALE RAD50 CHARACTER MOV R1,R5 ;RESULT TO R5 MOV (SP)+,R1 ;RETRIEVE PREVIOUS ACCUMULATION MOV (SP)+,R0 ;RETRIEVE NEXT BYTE ADDRESS ADD R5,R1 ;ACCUMULATE RESULT CMP R3,#CVTBL+6 ;CONVERTED THREE YET? BLO 10$ ;IF LO NO TST (SP)+ ;CLEAN STACK-CLEAR CARRY BR 70$ ; 60$: COM (SP)+ ;CLEAN STACK AND SET CARRY 70$: MOVB -1(R0),R2 ;GET TERMINAL CHARACTER MOV (SP)+,R3 ;RESTORE R3 RETURN ; CNTRL: .BYTE 'Z,'A,'9,'0,'$,' ,'. ;CONTROL BYTE STRING .EVEN CVTBL: .WORD 50*50 ;RAD50 PACK MULTIPLICATION .WORD 50 ; .WORD 1 ; .ENDC ;+ ; **-$SAVNR-SAVE NONVOLATILE REGISTERS ; ; THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5. ;- $SAVNR::MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SET RETURN ADDRESS MOV 4(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R5 ;RESTORE R5 RETURN ;RETURN TO ORIGINAL CALLER ;+ ; **-$UTEND-END OF UTILITY SUBROUTINES ; ; THIS ADDRESS IS THE LAST ADDRESS IN THE KERNEL DATA SPACE EXEC OR THE ; MULTIPROCESSING EXEC WHICH A PRIVILEGED TASK NEEDS TO MAP. ; ;- $UTEND:: ; .END